1 : <?php
2 : /*--------------------------------------------------------------------------+
3 : This file is part of eStudy.
4 : teams/classes/class.userteammanagement.inc.php
5 : - Modulgruppe: Teams
6 : - Beschreibung: Klasse zum Verwalten der Team-Zuordnungen der Teilnehmer.
7 : - Version: 0.3, 19/11/06
8 : - Autor(en): Clemens Weiß <clemens.weiss@mni.fh-giessen.de>
9 : +---------------------------------------------------------------------------+
10 : This program is free software; you can redistribute it and/or
11 : modify it under the terms of the GNU General Public License
12 : as published by the Free Software Foundation; either version 2
13 : of the License, or any later version.
14 : +---------------------------------------------------------------------------+
15 : This program is distributed in the hope that it will be useful,
16 : but WITHOUT ANY WARRANTY; without even the implied warranty of
17 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 : GNU General Public License for more details.
19 : You should have received a copy of the GNU General Public License
20 : along with this program; if not, write to the Free Software
21 : Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
22 : +--------------------------------------------------------------------------*/
23 : /**
24 : * Klasse zum Verwalten der Team-Zuordnungen der Teilnehmer.
25 : * @package eStudy.Teams
26 : * @version 0.3, 19/11/06
27 : * @author Clemens Weiß <clemens.weiss@mni.fh-giessen.de>
28 : */
29 : if(! defined("PATH_TO_ROOT")) define("PATH_TO_ROOT","../../");
30 : require_once (PATH_TO_ROOT."teams/classes/class.teamlist.inc.php");
31 : require_once (PATH_TO_ROOT."courses/classes/class.Course.inc.php");
32 : require_once (PATH_TO_ROOT."roleplay/classes/class.userrolemanagement.inc.php");
33 :
34 : class UserTeamManagement {
35 : /**
36 : * ID des Kurses, für den die Team-Zuordnungen verwaltet werden sollen
37 : * @var int
38 : * @access private
39 : */
40 : private $courseID;
41 : /**
42 : * Array mit den Vor- und Nachnamen aller Kurs-Mitglieder
43 : * @var array
44 : * @access private
45 : */
46 : private $users;
47 : /**
48 : * Konstruktor
49 : * @access public
50 : * @param int $courseID ID des Kurses, für den die Team-Zuordnungen verwaltet werden sollen
51 : */
52 : public function UserTeamManagement($courseID) {
53 0 : $this->courseID = (int)$courseID;
54 0 : $this->users = array();
55 0 : $users = Course::getParticipants($this->courseID, "all", "user.Nachname, user.Vorname");
56 0 : if (is_array($users)) {
57 0 : foreach($users as $user) {
58 0 : $this->users[(int)$user->userid] = "$user->lastname, $user->firstname";
59 0 : }
60 0 : }
61 0 : }
62 : /**
63 : * Gibt das Team-Objekt eines Benutzers zurück oder 0, falls der
64 : * Benutzer zu keinem Team gehört.
65 : *
66 : * @access public
67 : * @param int $userID ID des Benutzers
68 : * @return mixed Team-Objekt des Benutzers oder 0 oder false bei ungültiger User-ID
69 : */
70 : public function getTeamOfUser($userID) {
71 0 : global $db, $settings;
72 0 : $dbp = $settings["dbPrefix"];
73 0 : if (strval(intval($userID)) != $userID || $userID <= 0) {
74 0 : return false;
75 : }
76 0 : $teamID = $db->get_var("SELECT team_id FROM {$dbp}user_team JOIN {$dbp}teams ON id=team_id WHERE user_id='$userID' AND course_id='$this->courseID'");
77 0 : if ($teamID > 0) {
78 0 : return new Team($teamID);
79 : }
80 0 : return 0;
81 : }
82 : /**
83 : * Gibt die User-IDs der Team-Mitglieder in einem Array zurück.
84 : *
85 : * @access public
86 : * @param int $teamID ID des Teams
87 : * @return mixed Array mit Integer-IDs oder false bei ungültiger Team-ID
88 : */
89 : public function getUsersOfTeam($teamID) {
90 0 : global $db, $settings;
91 0 : $dbp = $settings["dbPrefix"];
92 0 : if (strval(intval($teamID)) != $teamID || $teamID <= 0) {
93 0 : return false;
94 : }
95 0 : $userIDs = $db->get_col("SELECT user_id FROM {$dbp}user_team ut JOIN {$dbp}user u ON ut.user_id=u.ID WHERE ut.team_id='$teamID' ORDER BY Nachname, Vorname");
96 0 : if (is_array($userIDs)) {
97 0 : $userIDs = array_map("intval", $userIDs);
98 0 : return $userIDs;
99 : }
100 0 : return array();
101 : }
102 : /**
103 : * Listet alle Teams dieses Kurses inkl. der Mitglieder und freien Plätze auf.
104 : *
105 : * @access public
106 : * @return void
107 : */
108 : public function listTeams() {
109 0 : global $db, $settings;
110 0 : $dbp = $settings["dbPrefix"];
111 0 : $urm = new UserRoleManagement($this->courseID);
112 0 : $output = "<ul class='teamsOverview'>\n";
113 0 : foreach(TeamList::getTeams($this->courseID) as $team) {
114 0 : $userIDs = $this->getUsersOfTeam($team->getID());
115 0 : $available = $team->getMaxMembers() -count($userIDs);
116 0 : $output .= "<li>".Data::toHTML($team->getName(), false);
117 0 : if ($available == 1) {
118 0 : $output .= " (noch <strong>1</strong> freier Platz)";
119 0 : } elseif ($available > 0) {
120 0 : $output .= " (noch <strong>$available</strong> freie Plätze)";
121 0 : } elseif ($team->getMaxMembers() == 0) {
122 0 : $output .= " (noch <strong>beliebig viele</strong> freie Plätze)";
123 0 : } else {
124 0 : $output .= " (alle Plätze belegt)";
125 : }
126 0 : $teamID = (int)$team->getID();
127 0 : $crp = (int)$db->get_var("SELECT SUM(CrP) FROM user_team WHERE team_id='$teamID'");
128 0 : if ($crp > 0) {
129 0 : $output .= " <strong>$crp CrP </strong> (entsprechen ";
130 0 : $output .= $crp * 30;
131 0 : $output .= " Arbeitsstunden)";
132 0 : }
133 0 : if (count($userIDs)) {
134 0 : $output .= "<ul>";
135 0 : foreach($userIDs as $userID) {
136 0 : $data = $db->get_row("SELECT CrP, editCalendar FROM {$dbp}user_team WHERE user_id='$userID' AND team_id='$teamID'");
137 0 : $userCrp = (int)$data->CrP;
138 0 : $editCalendar = $data->editCalendar;
139 0 : $output .= "<li>";
140 0 : if ($userCrp > 0) {
141 0 : $output .= "$userCrp CrP ";
142 0 : }
143 0 : $output .= "<a href='".PATH_TO_ROOT."user/homepage.php?user=$userID'>".Data::toHTML($this->users[$userID], false) ."</a>";
144 0 : if ($roles = $urm->getRolesOfUser((int)$userID, true)) {
145 0 : $gender = $db->get_var("SELECT gender FROM {$dbp}user WHERE ID='$userID'");
146 0 : $role = array_pop($roles);
147 0 : $output .= " (".$role["role"]->getPropertiesLink($role["role"]->getName($gender)) .")";
148 0 : }
149 : // Teamtermine eintragen
150 0 : if ($editCalendar != null) {
151 0 : $currentUser = Data::toMysql($_SESSION['userid']);
152 0 : $userList = $db->get_col("SELECT user_id FROM {$dbp}user_team WHERE user_id='$currentUser' AND team_id='$teamID'");
153 0 : if ($userList != null || $_SESSION['usergroup'] == DOZENT || $_SESSION['usergroup'] == ADMIN) {
154 0 : if ($editCalendar == "1") {
155 0 : $output .= " (<a href=\"javascript:editNot(".$userID.",".$teamID.");\" title=\"Teamtermine nicht mehr editieren dürfen\">darf Teamtermine eintragen</a>)";
156 0 : } else {
157 0 : $output .= " (<a href=\"javascript:editDo(".$userID.",".$teamID.");\" title=\"Teamtermine editieren dürfen\">darf keine Teamtermine eintragen</a>)";
158 : }
159 0 : } else if ($userList == null && ($_SESSION['usergroup'] == DOZENT || $_SESSION['usergroup'] == ADMIN)) {
160 0 : if ($editCalendar == "1") {
161 0 : $output .= " (darf Teamtermine eintragen)";
162 0 : } else {
163 0 : $output .= " (darf keine Teamtermine eintragen)";
164 : }
165 0 : }
166 0 : }
167 0 : $output .= "</li>\n";
168 0 : }
169 0 : $output .= "</ul>\n";
170 0 : }
171 0 : $output .= "</li>\n";
172 0 : }
173 0 : $output .= "</ul>";
174 0 : return $output;
175 : }
176 : /**
177 : * Zeigt das Formular an, mit dem sich der Benutzer selbst einem Team zuordnen kann oder
178 : * einen Hinweis, falls es keine Teams mit freien Plätzen mehr gibt.
179 : *
180 : * @access public
181 : * @return void
182 : */
183 : public function showUserTeamForm() {
184 0 : $teams = TeamList::getTeams($this->courseID);
185 0 : if (count($teams)) {
186 0 : $output = "<form action='".PATH_TO_ROOT.SCRIPT_NAME."' method='post'>"."<ul class='teamsOverview'>\n";
187 0 : $closingDate = TeamList::getTeamClosingDate($this->courseID);
188 0 : $time = time();
189 0 : if ($closingDate > $time) {
190 0 : $output .= "<li><input type='radio' name='team' id='team0' value='0' ".(!isset($_SESSION["teamID"]) ? "checked='checked' " : "") ."/> "."<label for='team0'><em>Kein Team</em></label>";
191 0 : }
192 0 : $count = 0;
193 0 : foreach($teams as $team) {
194 0 : $teamID = $team->getID();
195 0 : $userIDs = $this->getUsersOfTeam($team->getID());
196 0 : $available = $team->getMaxMembers() - count($userIDs);
197 0 : if ($available > 0 || $team->getMaxMembers() == 0 || (in_array($_SESSION["userid"], $userIDs) && $closingDate > $time)) {
198 0 : $output .= "<li><input type='radio' name='team' id='team$teamID' value='".$teamID."' ".(isset($_SESSION["teamID"]) && $_SESSION["teamID"] == $teamID ? "checked='checked' " : "") ."/> "."<label for='team".$teamID."'>".Data::toHTML($team->getName(), false) ."</label>";
199 0 : $count++;
200 0 : if (count($userIDs)) {
201 0 : $output .= "<ul>";
202 0 : foreach($userIDs as $userID) {
203 0 : $output .= "<li><a href='".PATH_TO_ROOT."user/homepage.php?user=$userID'>".Data::toHTML($this->users[$userID], false) ."</a></li>\n";
204 0 : }
205 0 : $output .= "</ul>\n";
206 0 : }
207 0 : $output .= "</li>\n";
208 0 : }
209 0 : }
210 0 : $output .= "</ul>\n";
211 0 : if ($count) {
212 0 : $output .= "<p class='pForm'><input type='submit' name='okButton' value='Speichern' /></p>";
213 0 : } else {
214 0 : $output .= "<p>Leider sind keine Plätze in Teams mehr frei.</p>";
215 : }
216 0 : $output .= "</form>";
217 0 : } else {
218 0 : $output .= "<p>Es wurden noch keine Teams angelegt.</p>";
219 : }
220 0 : return $output;
221 : }
222 : /**
223 : * Speichert eine Team-Zuordnung mit allen notwendigen Überprüfungen.
224 : * Wird 0 als Team-ID übergeben, wird die Team-Zugehörigkeit des Benutzers gelöscht.
225 : *
226 : * @access public
227 : * @param int $userID ID des Benutzers
228 : * @param int $teamID ID des Teams oder 0
229 : * @return mixed true bei Erfolg oder String mit Fehlermeldung
230 : */
231 : public function setTeamForUser($userID, $teamID) {
232 0 : global $db, $settings, $EZSQL_ERROR;
233 0 : $dbp = $settings["dbPrefix"];
234 0 : if (strval(intval($userID)) != $userID || !in_array($userID, array_keys($this->users))) {
235 0 : return "Ungültige User-ID";
236 : }
237 0 : $teams = TeamList::getTeams($this->courseID);
238 0 : if ($teamID > 0) {
239 0 : if (strval(intval($teamID)) != $teamID || !in_array($teamID, array_keys($teams))) {
240 0 : return "Ungültige Team-ID";
241 : }
242 0 : if (TeamList::getTeamClosingDate($this->courseID) < time() && $this->getTeamOfUser($userID) !== 0) {
243 0 : return "Sie sind bereits Mitglied in einem Team.";
244 : }
245 0 : $team = new Team($teamID);
246 0 : if ($team->getMaxMembers() != 0 && count($this->getUsersOfTeam($teamID)) >= $team->getMaxMembers()) {
247 0 : return "In dem Team ist leider kein Platz mehr.";
248 : }
249 0 : }
250 0 : $errorCount = count($EZSQL_ERROR);
251 0 : $db->query("DELETE FROM {$dbp}user_team WHERE user_id='$userID' AND team_id IN (".implode(", ", array_keys($teams)) .")");
252 0 : if ($teamID > 0) {
253 0 : $db->query("INSERT INTO {$dbp}user_team (user_id, team_id) VALUES ('$userID', '$teamID')");
254 0 : }
255 0 : if (count($EZSQL_ERROR) > $errorCount) {
256 0 : return "Datenbank-Fehler";
257 : }
258 0 : return true;
259 : }
260 : /**
261 : * Gibt für jedes Team in diesem Kurs eine select-Box aus, in der
262 : * aus allen Kurs-Mitgliedern ausgewählt werden kann, wer dem Team zugeordnet ist.
263 : *
264 : * @access public
265 : * @return void
266 : */
267 : public function showTeamAssignmentForms() {
268 0 : $size = count($this->users);
269 0 : if ($size > 8) $size = 8;
270 0 : $output = "";
271 0 : foreach(TeamList::getTeams($this->courseID) as $team) {
272 0 : $userIDs = $this->getUsersOfTeam($team->getID());
273 0 : $output .= "<form action='".PATH_TO_ROOT.SCRIPT_NAME."' method='post' class='teamAssignmentForm'><p>\n"."<input type='hidden' name='teamID' value='".$team->getID() ."' />\n"."<strong>".Data::toHTML($team->getName(), false) ."</strong><br />\n"."<select name='users[]' size='$size' multiple='multiple'>\n";
274 0 : foreach($this->users as $userID => $userName) {
275 0 : $output .= "<option value='$userID'".(in_array($userID, $userIDs) ? " selected='selected'" : "") .">".Data::toHTML($userName, false) ."</option>\n";
276 0 : }
277 0 : $output .= "</select><br />"."<input type='submit' name='okButton' value='Speichern' /> "."<input type='reset' value='Auswahl zurücksetzen' />"."</p></form>\n";
278 0 : }
279 0 : return $output;
280 : }
281 : /**
282 : * Ordnet alle im Array angegebenen Benutzer-IDs dem angegebenen Team zu.
283 : * Bestehende Zuordnungen von Benutzern, die nicht im Array enthalten sind,
284 : * werden gelöscht.
285 : *
286 : * @access public
287 : * @param int $teamID ID des Teams, zu dem die Benutzer zugeordnet werden sollen
288 : * @param array $users Array von Benutzer-IDs, die dem Team zugeordnet werden sollen
289 : * @return mixed true bei Erfolg, sonst String mit Fehlermeldung
290 : */
291 : public function assignUsersToTeam($teamID, $users) {
292 0 : global $db, $settings, $EZSQL_ERROR;
293 0 : $dbp = $settings["dbPrefix"];
294 0 : if (strval(intval($teamID)) != $teamID || $teamID <= 0 || !is_array($users)) {
295 0 : return "Ungültige Übergabe-Werte";
296 : }
297 0 : $users = array_map("intval", $users);
298 0 : if (count(array_diff($users, array_keys($this->users)))) {
299 0 : return "Einer der Benutzer ist nicht Mitglied dieses Kurses.";
300 : }
301 0 : $oldUsers = $this->getUsersOfTeam($teamID);
302 0 : $insert = array_diff($users, $oldUsers);
303 0 : $delete = array_diff($oldUsers, $users);
304 0 : $team = new Team($teamID);
305 0 : if ($team->getMaxMembers() > 0 && (count($oldUsers) +count($insert) -count($delete)) > $team->getMaxMembers()) {
306 0 : return "Die maximale Teilnehmerzahl dieses Teams beträgt ".$team->getMaxMembers();
307 : }
308 0 : foreach($insert as $userID) {
309 0 : if ($this->getTeamOfUser($userID) !== 0) {
310 0 : return "Der Benutzer ".$this->users[$userID]." ist bereits Mitglied in einem Team.";
311 : }
312 0 : }
313 0 : $errorCount = count($EZSQL_ERROR);
314 0 : if (count($insert)) {
315 0 : $db->query("INSERT INTO {$dbp}user_team (user_id, team_id) VALUES ('".implode("', '$teamID'), ('", $insert) ."', '$teamID')");
316 0 : }
317 0 : if (count($delete)) {
318 0 : $db->query("DELETE FROM {$dbp}user_team WHERE user_id IN (".implode(", ", $delete) .") AND team_id='$teamID'");
319 0 : }
320 0 : if (count($EZSQL_ERROR) > $errorCount) {
321 0 : return "Datenbank-Fehler";
322 : }
323 0 : return true;
324 : }
325 : /**
326 : * Gibt die IDs der Benutzer dieses Kurses zurück, die sich in ein Team einwählen können.
327 : * Das kann z.B. für die Prüfung von Zugriffsrechten verwendet werden.
328 : *
329 : * @access public
330 : * @return array Array mit User-IDs
331 : */
332 : public function getUserIDs() {
333 0 : return array_keys($this->users);
334 : }
335 : }
336 :
|